home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / aminet / mus / play / pt_fixed.lha / PT-CIAPlay.s next >
Text File  |  1993-04-25  |  27KB  |  1,390 lines

  1. ;********************************************
  2. ;* ----- Protracker V1.1B Playroutine ----- *
  3. ;* Lars "Zap" Hamre/Amiga Freelancers 1991  *
  4. ;* Bekkeliveien 10, N-2010 STRØMMEN, Norway *
  5. ;********************************************
  6.  
  7. ; CIA Version 1:
  8. ; Call SetCIAInt to install the interrupt server. Then call mt_init
  9. ; to initialize the song. Playback starts when the mt_enable flag
  10. ; is set to a nonzero value. To end the song and turn off all voices,
  11. ; call mt_end. At last, call ResetCIAInt to remove the interrupt.
  12.  
  13. ; This playroutine is not very fast, optimized or well commented,
  14. ; but all the new commands in PT1.1 should work.
  15. ; If it's not good enough, you'll have to change it yourself.
  16. ; We'll try to write a faster routine soon...
  17.  
  18. ; Changes from V1.0C playroutine:
  19. ; - Vibrato depth changed to be compatible with Noisetracker 2.0.
  20. ;   You'll have to double all vib. depths on old PT modules.
  21. ; - Funk Repeat changed to Invert Loop.
  22. ; - Period set back earlier when stopping an effect.
  23.  
  24. ; You can use this routine to play a module. Just remove the semicolons.
  25. ; Exit by pressing both mousebuttons.
  26. ;
  27. ;main    BSR.S    SetCIAInt
  28. ;    BSR    mt_init
  29. ;    ST    mt_Enable
  30. ;    MOVE.L    4.W,A6
  31. ;    LEA    DOSname(PC),A1
  32. ;    MOVEQ    #0,D0
  33. ;    JSR    LVOOpenLibrary(A6)
  34. ;    TST.L    D0
  35. ;    BEQ.S    theend
  36. ;    MOVE.L    D0,A6
  37. ;wloop    MOVEQ    #10,D1
  38. ;    JSR    LVODelay(A6)
  39. ;    BTST    #6,$BFE001
  40. ;    BNE.S    wloop
  41. ;    BTST    #2,$DFF016
  42. ;    BNE.S    wloop
  43. ;    MOVE.L    A6,A1
  44. ;    MOVE.L    4.W,A6
  45. ;    JSR    LVOCloseLibrary(A6)
  46. ;theend    BSR    mt_end
  47. ;    BSR    ResetCIAInt
  48. ;    RTS
  49. ;
  50. ;DOSname    dc.b "dos.library",0
  51.  
  52. ;---- CIA Interrupt ----
  53.  
  54. AddICRVector    =   -6
  55. RemICRVector    =  -12
  56. LVOOpenResource    = -498
  57. LVOOpenLibrary     = -552
  58. LVOCloseLibrary    = -414
  59. LVODelay    = -198
  60.  
  61. ciatalo = $400
  62. ciatahi = $500
  63. ciatblo = $600
  64. ciatbhi = $700
  65. ciacra  = $E00
  66. ciacrb  = $F00
  67.  
  68. SetCIAInt
  69.     MOVEQ    #2,D6
  70.     LEA    $BFD000,A5
  71.     MOVE.B    #'b',CIAAname+3
  72. SetCIALoop
  73.     MOVEQ    #0,D0
  74.     LEA    CIAAname(PC),A1
  75.     MOVE.L    4.W,A6
  76.     JSR    LVOOpenResource(A6)
  77.     MOVE.L    D0,CIAAbase
  78.     BEQ    mt_Return
  79.  
  80.     LEA    GfxName(PC),A1
  81.     MOVEQ    #0,D0
  82.     JSR    LVOOpenLibrary(A6)
  83.     TST.L    D0
  84.     BEQ    ResetCIAInt
  85.     MOVE.L    D0,A1
  86.     MOVE.W    206(A1),D0    ; DisplayFlags
  87.     BTST    #2,D0        ; PAL?
  88.     BEQ.S    WasNTSC
  89.     MOVE.L    #1773447,D7 ; PAL
  90.     BRA.S    sciask
  91. WasNTSC    MOVE.L    #1789773,D7 ; NTSC
  92. sciask    MOVE.L    D7,TimerValue
  93.     DIVU    #125,D7 ; Default to normal 50 Hz timer
  94.     JSR    CloseLibrary(A6)
  95.  
  96.     MOVE.L    CIAAbase(PC),A6
  97.     CMP.W    #2,D6
  98.     BEQ.S    TryTimerA
  99. TryTimerB
  100.     LEA    MusicIntServer(PC),A1
  101.     MOVEQ    #1,D0    ; Bit 1: Timer B
  102.     JSR    AddICRVector(A6)
  103.     MOVE.L    #1,TimerFlag
  104.     TST.L    D0
  105.     BNE.S    CIAError
  106.     MOVE.L    A5,CIAAaddr
  107.     MOVE.B    D7,ciatblo(A5)
  108.     LSR.W    #8,D7
  109.     MOVE.B    D7,ciatbhi(A5)
  110.     BSET    #0,ciacrb(A5)
  111.     RTS
  112.  
  113. TryTimerA
  114.     LEA    MusicIntServer(PC),A1
  115.     MOVEQ    #0,D0    ; Bit 0: Timer A
  116.     JSR    AddICRVector(A6)
  117.     CLR.L    TimerFlag
  118.     TST.L    D0
  119.     BNE.S    CIAError
  120.     MOVE.L    A5,CIAAaddr
  121.     MOVE.B    D7,ciatalo(A5)
  122.     LSR.W    #8,D7
  123.     MOVE.B    D7,ciatahi(A5)
  124.     BSET    #0,ciacra(A5)
  125.     RTS
  126.  
  127. CIAError
  128.     MOVE.B    #'a',CIAAname+3
  129.     LEA    $BFE001,A5
  130.     SUBQ.W    #1,D6
  131.     BNE    SetCIALoop
  132.     CLR.L    CIAAbase
  133.     RTS
  134.  
  135. ResetCIAInt
  136.     MOVE.L    CIAAbase(PC),D0
  137.     BEQ    mt_Return
  138.     CLR.L    CIAAbase
  139.     MOVE.L    D0,A6
  140.     MOVE.L    CIAAaddr(PC),A5
  141.     TST.L    TimerFlag
  142.     BEQ.S    ResTimerA
  143.  
  144.     BCLR    #0,ciacrb(A5)
  145.     MOVEQ    #1,D0
  146.     BRA.S    RemInt
  147.  
  148. ResTimerA
  149.     BCLR    #0,ciacra(A5)
  150.     MOVEQ    #0,D0
  151. RemInt    LEA    MusicIntServer(PC),A1
  152.     MOVEQ    #0,d0
  153.     JSR    RemICRVector(A6)
  154.     RTS
  155.  
  156. ;---- Tempo ----
  157.  
  158. SetTempo
  159.     MOVE.L    CIAAbase(PC),D2
  160.     BEQ    mt_Return
  161.     CMP.W    #32,D0
  162.     BHS.S    setemsk
  163.     MOVEQ    #32,D0
  164. setemsk    MOVE.W    D0,RealTempo
  165.     MOVE.L    TimerValue(PC),D2
  166.     DIVU    D0,D2
  167.     MOVE.L    CIAAaddr(PC),A4
  168.     MOVE.L    TimerFlag(PC),D0
  169.     BEQ.S    SetTemA
  170.     MOVE.B    D2,ciatblo(A4)
  171.     LSR.W    #8,D2
  172.     MOVE.B    D2,ciatbhi(A4)
  173.     RTS
  174.  
  175. SetTemA    MOVE.B    D2,ciatalo(A4)
  176.     LSR.W    #8,D2
  177.     MOVE.B    D2,ciatahi(A4)
  178.     RTS
  179.  
  180. RealTempo    dc.w 125
  181. CIAAaddr    dc.l 0
  182. CIAAname    dc.b "ciaa.resource",0
  183. CIAAbase    dc.l 0
  184. TimerFlag    dc.l 0
  185. TimerValue    dc.l 0
  186. GfxName        dc.b "graphics.library",0,0
  187.  
  188. MusicIntServer
  189.     dc.l 0,0
  190.     dc.b 2,5 ; type, priority
  191.     dc.l musintname
  192.     dc.l 0,mt_music
  193.  
  194. musintname    dc.b "Protracker MusicInt",0
  195.  
  196. ;---- Playroutine ----
  197.  
  198. n_note        EQU    0  ; W
  199. n_cmd        EQU    2  ; W
  200. n_cmdlo        EQU    3  ; B
  201. n_start        EQU    4  ; L
  202. n_length    EQU    8  ; W
  203. n_loopstart    EQU    10 ; L
  204. n_replen    EQU    14 ; W
  205. n_period    EQU    16 ; W
  206. n_finetune    EQU    18 ; B
  207. n_volume    EQU    19 ; B
  208. n_dmabit    EQU    20 ; W
  209. n_toneportdirec    EQU    22 ; B
  210. n_toneportspeed    EQU    23 ; B
  211. n_wantedperiod    EQU    24 ; W
  212. n_vibratocmd    EQU    26 ; B
  213. n_vibratopos    EQU    27 ; B
  214. n_tremolocmd    EQU    28 ; B
  215. n_tremolopos    EQU    29 ; B
  216. n_wavecontrol    EQU    30 ; B
  217. n_glissfunk    EQU    31 ; B
  218. n_sampleoffset    EQU    32 ; B
  219. n_pattpos    EQU    33 ; B
  220. n_loopcount    EQU    34 ; B
  221. n_funkoffset    EQU    35 ; B
  222. n_wavestart    EQU    36 ; L
  223. n_reallength    EQU    40 ; W
  224.  
  225. mt_init    LEA    mt_data,A0
  226.     MOVE.L    A0,mt_SongDataPtr
  227.     MOVE.L    A0,A1
  228.     LEA    952(A1),A1
  229.     MOVEQ    #127,D0
  230.     MOVEQ    #0,D1
  231.     MOVEQ    #0,D2
  232. mtloop    MOVE.B    (A1)+,D1
  233.     CMP.B    D2,D1
  234.     BCS.S    mtloop2
  235.     MOVE.L    D1,D2
  236. mtloop2    DBRA    D0,mtloop
  237.     ADDQ.B    #1,D2
  238.  
  239.     LEA    mt_SampleStarts(PC),A1
  240.     ASL.L    #8,D2
  241.     ASL.L    #2,D2
  242.     ADD.L    #1084,D2
  243.     ADD.L    A0,D2
  244.     MOVE.L    D2,A2
  245.     MOVEQ    #30,D0
  246. mtloop3    CLR.L    (A2)
  247.     MOVE.L    A2,(A1)+
  248.     MOVEQ    #0,D1
  249.     MOVE.W    42(A0),D1
  250.     ASL.L    #1,D1
  251.     ADD.L    D1,A2
  252.     ADD.L    #30,A0
  253.     DBRA    D0,mtloop3
  254.  
  255.     OR.B    #2,$BFE001
  256.     MOVE.B    #6,mt_speed
  257.     CLR.B    mt_counter
  258.     CLR.B    mt_SongPos
  259.     CLR.W    mt_PatternPos
  260. mt_end    SF    mt_Enable
  261.     LEA    $DFF000,A0
  262.     CLR.W    $A8(A0)
  263.     CLR.W    $B8(A0)
  264.     CLR.W    $C8(A0)
  265.     CLR.W    $D8(A0)
  266.     MOVE.W    #$F,$DFF096
  267.     RTS
  268.  
  269. mt_music
  270.     MOVEM.L    D0-D4/A0-A6,-(SP)
  271.     TST.B    mt_Enable
  272.     BEQ    mt_exit
  273.     ADDQ.B    #1,mt_counter
  274.     MOVE.B    mt_counter(PC),D0
  275.     CMP.B    mt_speed(PC),D0
  276.     BLO.S    mt_NoNewNote
  277.     CLR.B    mt_counter
  278.     TST.B    mt_PattDelTime2
  279.     BEQ.S    mt_GetNewNote
  280.     BSR.S    mt_NoNewAllChannels
  281.     BRA    mt_dskip
  282.  
  283. mt_NoNewNote
  284.     BSR.S    mt_NoNewAllChannels
  285.     BRA    mt_NoNewPosYet
  286.  
  287. mt_NoNewAllChannels
  288.     LEA    $DFF0A0,A5
  289.     LEA    mt_chan1temp(PC),A6
  290.     BSR    mt_CheckEfx
  291.     LEA    $DFF0B0,A5
  292.     LEA    mt_chan2temp(PC),A6
  293.     BSR    mt_CheckEfx
  294.     LEA    $DFF0C0,A5
  295.     LEA    mt_chan3temp(PC),A6
  296.     BSR    mt_CheckEfx
  297.     LEA    $DFF0D0,A5
  298.     LEA    mt_chan4temp(PC),A6
  299.     BRA    mt_CheckEfx
  300.  
  301. mt_GetNewNote
  302.     MOVE.L    mt_SongDataPtr(PC),A0
  303.     LEA    12(A0),A3
  304.     LEA    952(A0),A2    ;pattpo
  305.     LEA    1084(A0),A0    ;patterndata
  306.     MOVEQ    #0,D0
  307.     MOVEQ    #0,D1
  308.     MOVE.B    mt_SongPos(PC),D0
  309.     MOVE.B    (A2,D0.W),D1
  310.     ASL.L    #8,D1
  311.     ASL.L    #2,D1
  312.     ADD.W    mt_PatternPos(PC),D1
  313.     CLR.W    mt_DMACONtemp
  314.  
  315.     LEA    $DFF0A0,A5
  316.     LEA    mt_chan1temp(PC),A6
  317.     BSR.S    mt_PlayVoice
  318.     LEA    $DFF0B0,A5
  319.     LEA    mt_chan2temp(PC),A6
  320.     BSR.S    mt_PlayVoice
  321.     LEA    $DFF0C0,A5
  322.     LEA    mt_chan3temp(PC),A6
  323.     BSR.S    mt_PlayVoice
  324.     LEA    $DFF0D0,A5
  325.     LEA    mt_chan4temp(PC),A6
  326.     BSR.S    mt_PlayVoice
  327.     BRA    mt_SetDMA
  328.  
  329. mt_PlayVoice
  330.     TST.L    (A6)
  331.     BNE.S    mt_plvskip
  332.     BSR    mt_PerNop
  333. mt_plvskip
  334.     MOVE.L    (A0,D1.L),(A6)
  335.     ADDQ.L    #4,D1
  336.     MOVEQ    #0,D2
  337.     MOVE.B    n_cmd(A6),D2
  338.     AND.B    #$F0,D2
  339.     LSR.B    #4,D2
  340.     MOVE.B    (A6),D0
  341.     AND.B    #$F0,D0
  342.     OR.B    D0,D2
  343.     TST.B    D2
  344.     BEQ    mt_SetRegs
  345.     MOVEQ    #0,D3
  346.     LEA    mt_SampleStarts(PC),A1
  347.     MOVE    D2,D4
  348.     SUBQ.L    #1,D2
  349.     ASL.L    #2,D2
  350.     MULU    #30,D4
  351.     MOVE.L    (A1,D2.L),n_start(A6)
  352.     MOVE.W    (A3,D4.L),n_length(A6)
  353.     MOVE.W    (A3,D4.L),n_reallength(A6)
  354.     MOVE.B    2(A3,D4.L),n_finetune(A6)
  355.     MOVE.B    3(A3,D4.L),n_volume(A6)
  356.     MOVE.W    4(A3,D4.L),D3 ; Get repeat
  357.     TST.W    D3
  358.     BEQ.S    mt_NoLoop
  359.     MOVE.L    n_start(A6),D2    ; Get start
  360.     ASL.W    #1,D3
  361.     ADD.L    D3,D2        ; Add repeat
  362.     MOVE.L    D2,n_loopstart(A6)
  363.     MOVE.L    D2,n_wavestart(A6)
  364.     MOVE.W    4(A3,D4.L),D0    ; Get repeat
  365.     ADD.W    6(A3,D4.L),D0    ; Add replen
  366.     MOVE.W    D0,n_length(A6)
  367.     MOVE.W    6(A3,D4.L),n_replen(A6)    ; Save replen
  368.     MOVEQ    #0,D0
  369.     MOVE.B    n_volume(A6),D0
  370.     MOVE.W    D0,8(A5)    ; Set volume
  371.     BRA.S    mt_SetRegs
  372.  
  373. mt_NoLoop
  374.     MOVE.L    n_start(A6),D2
  375.     ADD.L    D3,D2
  376.     MOVE.L    D2,n_loopstart(A6)
  377.     MOVE.L    D2,n_wavestart(A6)
  378.     MOVE.W    6(A3,D4.L),n_replen(A6)    ; Save replen
  379.     MOVEQ    #0,D0
  380.     MOVE.B    n_volume(A6),D0
  381.     MOVE.W    D0,8(A5)    ; Set volume
  382. mt_SetRegs
  383.     MOVE.W    (A6),D0
  384.     AND.W    #$0FFF,D0
  385.     BEQ    mt_CheckMoreEfx    ; If no note
  386.     MOVE.W    2(A6),D0
  387.     AND.W    #$0FF0,D0
  388.     CMP.W    #$0E50,D0
  389.     BEQ.S    mt_DoSetFineTune
  390.     MOVE.B    2(A6),D0
  391.     AND.B    #$0F,D0
  392.     CMP.B    #3,D0    ; TonePortamento
  393.     BEQ.S    mt_ChkTonePorta
  394.     CMP.B    #5,D0
  395.     BEQ.S    mt_ChkTonePorta
  396.     CMP.B    #9,D0    ; Sample Offset
  397.     BNE.S    mt_SetPeriod
  398.     BSR    mt_CheckMoreEfx
  399.     BRA.S    mt_SetPeriod
  400.  
  401. mt_DoSetFineTune
  402.     BSR    mt_SetFineTune
  403.     BRA.S    mt_SetPeriod
  404.  
  405. mt_ChkTonePorta
  406.     BSR    mt_SetTonePorta
  407.     BRA    mt_CheckMoreEfx
  408.  
  409. mt_SetPeriod
  410.     MOVEM.L    D0-D1/A0-A1,-(SP)
  411.     MOVE.W    (A6),D1
  412.     AND.W    #$0FFF,D1
  413.     LEA    mt_PeriodTable(PC),A1
  414.     MOVEQ    #0,D0
  415.     MOVEQ    #35,D2
  416. mt_ftuloop
  417.     CMP.W    (A1,D0.W),D1
  418.     BHS.S    mt_ftufound
  419.     ADDQ.L    #2,D0
  420.     DBRA    D2,mt_ftuloop
  421. mt_ftufound
  422.     MOVEQ    #0,D1
  423.     MOVE.B    n_finetune(A6),D1
  424.     MULU    #36*2,D1
  425.     ADD.L    D1,A1
  426.     MOVE.W    (A1,D0.W),n_period(A6)
  427.     MOVEM.L    (SP)+,D0-D1/A0-A1
  428.  
  429.     MOVE.W    2(A6),D0
  430.     AND.W    #$0FF0,D0
  431.     CMP.W    #$0ED0,D0 ; Notedelay
  432.     BEQ    mt_CheckMoreEfx
  433.  
  434. ;    MOVE.W    n_dmabit(A6),$DFF096
  435.     BTST    #2,n_wavecontrol(A6)
  436.     BNE.S    mt_vibnoc
  437.     CLR.B    n_vibratopos(A6)
  438. mt_vibnoc
  439.     BTST    #6,n_wavecontrol(A6)
  440.     BNE.S    mt_trenoc
  441.     CLR.B    n_tremolopos(A6)
  442. mt_trenoc
  443.     MOVE.L    n_start(A6),(A5)    ; Set start
  444.     MOVE.W    n_length(A6),4(A5)    ; Set length
  445. ;    MOVE.W    n_period(A6),6(A5)    ; Set period
  446.     MOVE.W    n_dmabit(A6),D0
  447.     OR.W    D0,mt_DMACONtemp
  448.     BRA    mt_CheckMoreEfx
  449.  
  450. mt_SetDMA
  451.     MOVE.W    mt_DMACONtemp(PC),D0
  452.     BSR    mt_PlaySamples        ; this does the magic
  453.     LEA    $DFF000,A5
  454.     LEA    mt_chan1temp(PC),A6
  455.     MOVE.L    n_loopstart(A6),$A0(A5)
  456.     MOVE.W    n_replen(A6),$A4(A5)
  457.     LEA    mt_chan2temp(PC),A6
  458.     MOVE.L    n_loopstart(A6),$B0(A5)
  459.     MOVE.W    n_replen(A6),$B4(A5)
  460.     LEA    mt_chan3temp(PC),A6
  461.     MOVE.L    n_loopstart(A6),$C0(A5)
  462.     MOVE.W    n_replen(A6),$C4(A5)
  463.     LEA    mt_chan4temp(PC),A6
  464.     MOVE.L    n_loopstart(A6),$D0(A5)
  465.     MOVE.W    n_replen(A6),$D4(A5)
  466.  
  467. mt_dskip
  468.     ADD.W    #16,mt_PatternPos
  469.     MOVE.B    mt_PattDelTime,D0
  470.     BEQ.S    mt_dskc
  471.     MOVE.B    D0,mt_PattDelTime2
  472.     CLR.B    mt_PattDelTime
  473. mt_dskc    TST.B    mt_PattDelTime2
  474.     BEQ.S    mt_dska
  475.     SUBQ.B    #1,mt_PattDelTime2
  476.     BEQ.S    mt_dska
  477.     SUB.W    #16,mt_PatternPos
  478. mt_dska    TST.B    mt_PBreakFlag
  479.     BEQ.S    mt_nnpysk
  480.     SF    mt_PBreakFlag
  481.     MOVEQ    #0,D0
  482.     MOVE.B    mt_PBreakPos(PC),D0
  483.     CLR.B    mt_PBreakPos
  484.     LSL.W    #4,D0
  485.     MOVE.W    D0,mt_PatternPos
  486. mt_nnpysk
  487.     CMP.W    #1024,mt_PatternPos
  488.     BLO.S    mt_NoNewPosYet
  489. mt_NextPosition    
  490.     MOVEQ    #0,D0
  491.     MOVE.B    mt_PBreakPos(PC),D0
  492.     LSL.W    #4,D0
  493.     MOVE.W    D0,mt_PatternPos
  494.     CLR.B    mt_PBreakPos
  495.     CLR.B    mt_PosJumpFlag
  496.     ADDQ.B    #1,mt_SongPos
  497.     AND.B    #$7F,mt_SongPos
  498.     MOVE.B    mt_SongPos(PC),D1
  499.     MOVE.L    mt_SongDataPtr(PC),A0
  500.     CMP.B    950(A0),D1
  501.     BLO.S    mt_NoNewPosYet
  502.     CLR.B    mt_SongPos
  503. mt_NoNewPosYet    
  504.     TST.B    mt_PosJumpFlag
  505.     BNE.S    mt_NextPosition
  506. mt_exit    MOVEM.L    (SP)+,D0-D4/A0-A6
  507.     RTS
  508.  
  509. ;
  510. ; busywait-fixed by Delirium Softdesign.
  511. ;
  512. ; the old routine wasted about 2*10 rasterlines, this routine needs 2-8 lines
  513. ; (depending on the module). It was tested on an A500/A3000/A4000 and seems to
  514. ; play all modules ok. BTW, using this new technique it should be no problem
  515. ; to fix the busywait-loops of almost every other replay !
  516. ;
  517. ; known bugs:
  518. ;
  519. ;  sometimes when a module starts playing and the first note is played on
  520. ;  a channel, the routine needs ~100 rasterlines (in the mt_Wait2 loop).
  521. ;  perhaps this is a dma problem ?
  522. ;
  523. ; if you know how to fix these bugs please contact me:
  524. ; kunath@informatik.tu-muenchen.de (Peter Kunath)
  525. ;
  526.  
  527. mt_PlaySamples
  528.     movem.l    d0-d2/a5-a6,-(sp)
  529.     lea    $DFF000,a5
  530.     move.w    d0,d2
  531.  
  532.     move.b    $06(a5),d0        ; wait until end of line
  533. ;    move.w    #$0ff,$180(a5)
  534. mt_Wait1
  535.     cmp.b    $06(a5),d0        ; the wait should be enough even on
  536.     beq.s    mt_Wait1        ; an A4000 running DBLPAL screenmode
  537. mt_MaxPer0
  538.     btst    #0,d2
  539.     beq.s    mt_MaxPer1
  540.     move.w    #1,$A6(a5)        ; max. speed
  541. mt_MaxPer1
  542.     btst    #1,d2
  543.     beq.s    mt_MaxPer2
  544.     move.w    #1,$B6(a5)        ; max. speed
  545. mt_MaxPer2
  546.     btst    #2,d2
  547.     beq.s    mt_MaxPer3
  548.     move.w    #1,$C6(a5)        ; max. speed
  549. mt_MaxPer3
  550.     btst    #3,d2
  551.     beq.s    mt_MaxPer4
  552.     move.w    #1,$D6(a5)        ; max. speed
  553. mt_MaxPer4
  554.     move.w    $02(a5),d0        ; get active channels
  555.     and.w    d2,d0
  556.     move.w    d0,d1
  557.     lsl.w    #7,d0
  558.     move.w    d0,$9C(a5)        ; stop channels
  559.     move.w    d1,$96(a5)
  560. ;    move.w    #$f00,$180(a5)
  561. mt_Wait2
  562.     move.w    $1E(a5),d1        ; wait until all channels are stopped
  563.     and.w    d0,d1
  564.     cmp.w    d0,d1
  565.     bne.s    mt_Wait2
  566.  
  567.     move.w    $02(a5),d0        ; get active channels
  568.     not.w    d0
  569.     and.w    d2,d0
  570.     move.w    d0,d1
  571.     lsl.w    #7,d0
  572.     move.w    d0,$9C(a5)
  573.     or.w    #$8000,d1
  574.     move.w    d1,$96(a5)        ; start channels
  575. ;    move.w    #$0f0,$180(a5)
  576. mt_Wait3
  577.     move.w    $1E(a5),d1        ; wait until all channels are running
  578.     and.w    d0,d1
  579.     cmp.w    d0,d1
  580.     bne.s    mt_Wait3
  581.     move.b    $06(a5),d0        ; wait until end of line
  582. ;    move.w    #$00f,$180(a5)
  583. mt_Wait4
  584.     cmp.b    $06(a5),d0        ; the wait should be enough even on
  585.     beq.s    mt_Wait4        ; an A4000 running DBLPAL screenmode
  586. mt_SetPer0
  587.     btst    #0,d2
  588.     beq.s    mt_SetPer1
  589.     lea    mt_chan1temp(pc),a6
  590.     move.w    n_period(a6),$A6(a5)
  591. mt_SetPer1
  592.     btst    #1,d2
  593.     beq.s    mt_SetPer2
  594.     lea    mt_chan2temp(pc),a6
  595.     move.w    n_period(a6),$B6(a5)
  596. mt_SetPer2
  597.     btst    #2,d2
  598.     beq.s    mt_SetPer3
  599.     lea    mt_chan3temp(pc),a6
  600.     move.w    n_period(a6),$C6(a5)
  601. mt_SetPer3
  602.     btst    #3,d2
  603.     beq.s    mt_SetPer4
  604.     lea    mt_chan4temp(pc),a6
  605.     move.w    n_period(a6),$D6(a5)
  606. mt_SetPer4
  607. ;    move.w    #$000,$180(a5)
  608.     movem.l    (sp)+,d0-d2/a5-a6
  609.     rts
  610.  
  611. mt_CheckEfx
  612.     BSR    mt_UpdateFunk
  613.     MOVE.W    n_cmd(A6),D0
  614.     AND.W    #$0FFF,D0
  615.     BEQ.S    mt_PerNop
  616.     MOVE.B    n_cmd(A6),D0
  617.     AND.B    #$0F,D0
  618.     BEQ.S    mt_Arpeggio
  619.     CMP.B    #1,D0
  620.     BEQ    mt_PortaUp
  621.     CMP.B    #2,D0
  622.     BEQ    mt_PortaDown
  623.     CMP.B    #3,D0
  624.     BEQ    mt_TonePortamento
  625.     CMP.B    #4,D0
  626.     BEQ    mt_Vibrato
  627.     CMP.B    #5,D0
  628.     BEQ    mt_TonePlusVolSlide
  629.     CMP.B    #6,D0
  630.     BEQ    mt_VibratoPlusVolSlide
  631.     CMP.B    #$E,D0
  632.     BEQ    mt_E_Commands
  633. SetBack    MOVE.W    n_period(A6),6(A5)
  634.     CMP.B    #7,D0
  635.     BEQ    mt_Tremolo
  636.     CMP.B    #$A,D0
  637.     BEQ    mt_VolumeSlide
  638. mt_Return
  639.     RTS
  640.  
  641. mt_PerNop
  642.     MOVE.W    n_period(A6),6(A5)
  643.     RTS
  644.  
  645. mt_Arpeggio
  646.     MOVEQ    #0,D0
  647.     MOVE.B    mt_counter(PC),D0
  648.     DIVS    #3,D0
  649.     SWAP    D0
  650.     CMP.W    #0,D0
  651.     BEQ.S    mt_Arpeggio2
  652.     CMP.W    #2,D0
  653.     BEQ.S    mt_Arpeggio1
  654.     MOVEQ    #0,D0
  655.     MOVE.B    n_cmdlo(A6),D0
  656.     LSR.B    #4,D0
  657.     BRA.S    mt_Arpeggio3
  658.  
  659. mt_Arpeggio1
  660.     MOVEQ    #0,D0
  661.     MOVE.B    n_cmdlo(A6),D0
  662.     AND.B    #15,D0
  663.     BRA.S    mt_Arpeggio3
  664.  
  665. mt_Arpeggio2
  666.     MOVE.W    n_period(A6),D2
  667.     BRA.S    mt_Arpeggio4
  668.  
  669. mt_Arpeggio3
  670.     ASL.W    #1,D0
  671.     MOVEQ    #0,D1
  672.     MOVE.B    n_finetune(A6),D1
  673.     MULU    #36*2,D1
  674.     LEA    mt_PeriodTable(PC),A0
  675.     ADD.L    D1,A0
  676.     MOVEQ    #0,D1
  677.     MOVE.W    n_period(A6),D1
  678.     MOVEQ    #35,D3
  679. mt_arploop
  680.     MOVE.W    (A0,D0.W),D2
  681.     CMP.W    (A0),D1
  682.     BHS.S    mt_Arpeggio4
  683.     ADDQ.L    #2,A0
  684.     DBRA    D3,mt_arploop
  685.     RTS
  686.  
  687. mt_Arpeggio4
  688.     MOVE.W    D2,6(A5)
  689.     RTS
  690.  
  691. mt_FinePortaUp
  692.     TST.B    mt_counter
  693.     BNE.S    mt_Return
  694.     MOVE.B    #$0F,mt_LowMask
  695. mt_PortaUp
  696.     MOVEQ    #0,D0
  697.     MOVE.B    n_cmdlo(A6),D0
  698.     AND.B    mt_LowMask(PC),D0
  699.     MOVE.B    #$FF,mt_LowMask
  700.     SUB.W    D0,n_period(A6)
  701.     MOVE.W    n_period(A6),D0
  702.     AND.W    #$0FFF,D0
  703.     CMP.W    #113,D0
  704.     BPL.S    mt_PortaUskip
  705.     AND.W    #$F000,n_period(A6)
  706.     OR.W    #113,n_period(A6)
  707. mt_PortaUskip
  708.     MOVE.W    n_period(A6),D0
  709.     AND.W    #$0FFF,D0
  710.     MOVE.W    D0,6(A5)
  711.     RTS    
  712.  
  713. mt_FinePortaDown
  714.     TST.B    mt_counter
  715.     BNE    mt_Return
  716.     MOVE.B    #$0F,mt_LowMask
  717. mt_PortaDown
  718.     CLR.W    D0
  719.     MOVE.B    n_cmdlo(A6),D0
  720.     AND.B    mt_LowMask(PC),D0
  721.     MOVE.B    #$FF,mt_LowMask
  722.     ADD.W    D0,n_period(A6)
  723.     MOVE.W    n_period(A6),D0
  724.     AND.W    #$0FFF,D0
  725.     CMP.W    #856,D0
  726.     BMI.S    mt_PortaDskip
  727.     AND.W    #$F000,n_period(A6)
  728.     OR.W    #856,n_period(A6)
  729. mt_PortaDskip
  730.     MOVE.W    n_period(A6),D0
  731.     AND.W    #$0FFF,D0
  732.     MOVE.W    D0,6(A5)
  733.     RTS
  734.  
  735. mt_SetTonePorta
  736.     MOVE.L    A0,-(SP)
  737.     MOVE.W    (A6),D2
  738.     AND.W    #$0FFF,D2
  739.     MOVEQ    #0,D0
  740.     MOVE.B    n_finetune(A6),D0
  741.     MULU    #36*2,D0
  742.     LEA    mt_PeriodTable(PC),A0
  743.     ADD.L    D0,A0
  744.     MOVEQ    #0,D0
  745. mt_StpLoop
  746.     CMP.W    (A0,D0.W),D2
  747.     BHS.S    mt_StpFound
  748.     ADDQ.W    #2,D0
  749.     CMP.W    #36*2,D0
  750.     BLO.S    mt_StpLoop
  751.     MOVEQ    #35*2,D0
  752. mt_StpFound
  753.     MOVE.B    n_finetune(A6),D2
  754.     AND.B    #8,D2
  755.     BEQ.S    mt_StpGoss
  756.     TST.W    D0
  757.     BEQ.S    mt_StpGoss
  758.     SUBQ.W    #2,D0
  759. mt_StpGoss
  760.     MOVE.W    (A0,D0.W),D2
  761.     MOVE.L    (SP)+,A0
  762.     MOVE.W    D2,n_wantedperiod(A6)
  763.     MOVE.W    n_period(A6),D0
  764.     CLR.B    n_toneportdirec(A6)
  765.     CMP.W    D0,D2
  766.     BEQ.S    mt_ClearTonePorta
  767.     BGE    mt_Return
  768.     MOVE.B    #1,n_toneportdirec(A6)
  769.     RTS
  770.  
  771. mt_ClearTonePorta
  772.     CLR.W    n_wantedperiod(A6)
  773.     RTS
  774.  
  775. mt_TonePortamento
  776.     MOVE.B    n_cmdlo(A6),D0
  777.     BEQ.S    mt_TonePortNoChange
  778.     MOVE.B    D0,n_toneportspeed(A6)
  779.     CLR.B    n_cmdlo(A6)
  780. mt_TonePortNoChange
  781.     TST.W    n_wantedperiod(A6)
  782.     BEQ    mt_Return
  783.     MOVEQ    #0,D0
  784.     MOVE.B    n_toneportspeed(A6),D0
  785.     TST.B    n_toneportdirec(A6)
  786.     BNE.S    mt_TonePortaUp
  787. mt_TonePortaDown
  788.     ADD.W    D0,n_period(A6)
  789.     MOVE.W    n_wantedperiod(A6),D0
  790.     CMP.W    n_period(A6),D0
  791.     BGT.S    mt_TonePortaSetPer
  792.     MOVE.W    n_wantedperiod(A6),n_period(A6)
  793.     CLR.W    n_wantedperiod(A6)
  794.     BRA.S    mt_TonePortaSetPer
  795.  
  796. mt_TonePortaUp
  797.     SUB.W    D0,n_period(A6)
  798.     MOVE.W    n_wantedperiod(A6),D0
  799.     CMP.W    n_period(A6),D0
  800.     BLT.S    mt_TonePortaSetPer
  801.     MOVE.W    n_wantedperiod(A6),n_period(A6)
  802.     CLR.W    n_wantedperiod(A6)
  803.  
  804. mt_TonePortaSetPer
  805.     MOVE.W    n_period(A6),D2
  806.     MOVE.B    n_glissfunk(A6),D0
  807.     AND.B    #$0F,D0
  808.     BEQ.S    mt_GlissSkip
  809.     MOVEQ    #0,D0
  810.     MOVE.B    n_finetune(A6),D0
  811.     MULU    #36*2,D0
  812.     LEA    mt_PeriodTable(PC),A0
  813.     ADD.L    D0,A0
  814.     MOVEQ    #0,D0
  815. mt_GlissLoop
  816.     CMP.W    (A0,D0.W),D2
  817.     BHS.S    mt_GlissFound
  818.     ADDQ.W    #2,D0
  819.     CMP.W    #36*2,D0
  820.     BLO.S    mt_GlissLoop
  821.     MOVEQ    #35*2,D0
  822. mt_GlissFound
  823.     MOVE.W    (A0,D0.W),D2
  824. mt_GlissSkip
  825.     MOVE.W    D2,6(A5) ; Set period
  826.     RTS
  827.  
  828. mt_Vibrato
  829.     MOVE.B    n_cmdlo(A6),D0
  830.     BEQ.S    mt_Vibrato2
  831.     MOVE.B    n_vibratocmd(A6),D2
  832.     AND.B    #$0F,D0
  833.     BEQ.S    mt_vibskip
  834.     AND.B    #$F0,D2
  835.     OR.B    D0,D2
  836. mt_vibskip
  837.     MOVE.B    n_cmdlo(A6),D0
  838.     AND.B    #$F0,D0
  839.     BEQ.S    mt_vibskip2
  840.     AND.B    #$0F,D2
  841.     OR.B    D0,D2
  842. mt_vibskip2
  843.     MOVE.B    D2,n_vibratocmd(A6)
  844. mt_Vibrato2
  845.     MOVE.B    n_vibratopos(A6),D0
  846.     LEA    mt_VibratoTable(PC),A4
  847.     LSR.W    #2,D0
  848.     AND.W    #$001F,D0
  849.     MOVEQ    #0,D2
  850.     MOVE.B    n_wavecontrol(A6),D2
  851.     AND.B    #$03,D2
  852.     BEQ.S    mt_vib_sine
  853.     LSL.B    #3,D0
  854.     CMP.B    #1,D2
  855.     BEQ.S    mt_vib_rampdown
  856.     MOVE.B    #255,D2
  857.     BRA.S    mt_vib_set
  858. mt_vib_rampdown
  859.     TST.B    n_vibratopos(A6)
  860.     BPL.S    mt_vib_rampdown2
  861.     MOVE.B    #255,D2
  862.     SUB.B    D0,D2
  863.     BRA.S    mt_vib_set
  864. mt_vib_rampdown2
  865.     MOVE.B    D0,D2
  866.     BRA.S    mt_vib_set
  867. mt_vib_sine
  868.     MOVE.B    (A4,D0.W),D2
  869. mt_vib_set
  870.     MOVE.B    n_vibratocmd(A6),D0
  871.     AND.W    #15,D0
  872.     MULU    D0,D2
  873.     LSR.W    #7,D2
  874.     MOVE.W    n_period(A6),D0
  875.     TST.B    n_vibratopos(A6)
  876.     BMI.S    mt_VibratoNeg
  877.     ADD.W    D2,D0
  878.     BRA.S    mt_Vibrato3
  879. mt_VibratoNeg
  880.     SUB.W    D2,D0
  881. mt_Vibrato3
  882.     MOVE.W    D0,6(A5)
  883.     MOVE.B    n_vibratocmd(A6),D0
  884.     LSR.W    #2,D0
  885.     AND.W    #$003C,D0
  886.     ADD.B    D0,n_vibratopos(A6)
  887.     RTS
  888.  
  889. mt_TonePlusVolSlide
  890.     BSR    mt_TonePortNoChange
  891.     BRA    mt_VolumeSlide
  892.  
  893. mt_VibratoPlusVolSlide
  894.     BSR.S    mt_Vibrato2
  895.     BRA    mt_VolumeSlide
  896.  
  897. mt_Tremolo
  898.     MOVE.B    n_cmdlo(A6),D0
  899.     BEQ.S    mt_Tremolo2
  900.     MOVE.B    n_tremolocmd(A6),D2
  901.     AND.B    #$0F,D0
  902.     BEQ.S    mt_treskip
  903.     AND.B    #$F0,D2
  904.     OR.B    D0,D2
  905. mt_treskip
  906.     MOVE.B    n_cmdlo(A6),D0
  907.     AND.B    #$F0,D0
  908.     BEQ.S    mt_treskip2
  909.     AND.B    #$0F,D2
  910.     OR.B    D0,D2
  911. mt_treskip2
  912.     MOVE.B    D2,n_tremolocmd(A6)
  913. mt_Tremolo2
  914.     MOVE.B    n_tremolopos(A6),D0
  915.     LEA    mt_VibratoTable(PC),A4
  916.     LSR.W    #2,D0
  917.     AND.W    #$001F,D0
  918.     MOVEQ    #0,D2
  919.     MOVE.B    n_wavecontrol(A6),D2
  920.     LSR.B    #4,D2
  921.     AND.B    #$03,D2
  922.     BEQ.S    mt_tre_sine
  923.     LSL.B    #3,D0
  924.     CMP.B    #1,D2
  925.     BEQ.S    mt_tre_rampdown
  926.     MOVE.B    #255,D2
  927.     BRA.S    mt_tre_set
  928. mt_tre_rampdown
  929.     TST.B    n_vibratopos(A6)
  930.     BPL.S    mt_tre_rampdown2
  931.     MOVE.B    #255,D2
  932.     SUB.B    D0,D2
  933.     BRA.S    mt_tre_set
  934. mt_tre_rampdown2
  935.     MOVE.B    D0,D2
  936.     BRA.S    mt_tre_set
  937. mt_tre_sine
  938.     MOVE.B    (A4,D0.W),D2
  939. mt_tre_set
  940.     MOVE.B    n_tremolocmd(A6),D0
  941.     AND.W    #15,D0
  942.     MULU    D0,D2
  943.     LSR.W    #6,D2
  944.     MOVEQ    #0,D0
  945.     MOVE.B    n_volume(A6),D0
  946.     TST.B    n_tremolopos(A6)
  947.     BMI.S    mt_TremoloNeg
  948.     ADD.W    D2,D0
  949.     BRA.S    mt_Tremolo3
  950. mt_TremoloNeg
  951.     SUB.W    D2,D0
  952. mt_Tremolo3
  953.     BPL.S    mt_TremoloSkip
  954.     CLR.W    D0
  955. mt_TremoloSkip
  956.     CMP.W    #$40,D0
  957.     BLS.S    mt_TremoloOk
  958.     MOVE.W    #$40,D0
  959. mt_TremoloOk
  960.     MOVE.W    D0,8(A5)
  961.     MOVE.B    n_tremolocmd(A6),D0
  962.     LSR.W    #2,D0
  963.     AND.W    #$003C,D0
  964.     ADD.B    D0,n_tremolopos(A6)
  965.     RTS
  966.  
  967. mt_SampleOffset
  968.     MOVEQ    #0,D0
  969.     MOVE.B    n_cmdlo(A6),D0
  970.     BEQ.S    mt_sononew
  971.     MOVE.B    D0,n_sampleoffset(A6)
  972. mt_sononew
  973.     MOVE.B    n_sampleoffset(A6),D0
  974.     LSL.W    #7,D0
  975.     CMP.W    n_length(A6),D0
  976.     BGE.S    mt_sofskip
  977.     SUB.W    D0,n_length(A6)
  978.     LSL.W    #1,D0
  979.     ADD.L    D0,n_start(A6)
  980.     RTS
  981. mt_sofskip
  982.     MOVE.W    #$0001,n_length(A6)
  983.     RTS
  984.  
  985. mt_VolumeSlide
  986.     MOVEQ    #0,D0
  987.     MOVE.B    n_cmdlo(A6),D0
  988.     LSR.B    #4,D0
  989.     TST.B    D0
  990.     BEQ.S    mt_VolSlideDown
  991. mt_VolSlideUp
  992.     ADD.B    D0,n_volume(A6)
  993.     CMP.B    #$40,n_volume(A6)
  994.     BMI.S    mt_vsuskip
  995.     MOVE.B    #$40,n_volume(A6)
  996. mt_vsuskip
  997.     MOVE.B    n_volume(A6),D0
  998.     MOVE.W    D0,8(A5)
  999.     RTS
  1000.  
  1001. mt_VolSlideDown
  1002.     MOVEQ    #0,D0
  1003.     MOVE.B    n_cmdlo(A6),D0
  1004.     AND.B    #$0F,D0
  1005. mt_VolSlideDown2
  1006.     SUB.B    D0,n_volume(A6)
  1007.     BPL.S    mt_vsdskip
  1008.     CLR.B    n_volume(A6)
  1009. mt_vsdskip
  1010.     MOVE.B    n_volume(A6),D0
  1011.     MOVE.W    D0,8(A5)
  1012.     RTS
  1013.  
  1014. mt_PositionJump
  1015.     MOVE.B    n_cmdlo(A6),D0
  1016.     SUBQ.B    #1,D0
  1017.     MOVE.B    D0,mt_SongPos
  1018. mt_pj2    CLR.B    mt_PBreakPos
  1019.     ST     mt_PosJumpFlag
  1020.     RTS
  1021.  
  1022. mt_VolumeChange
  1023.     MOVEQ    #0,D0
  1024.     MOVE.B    n_cmdlo(A6),D0
  1025.     CMP.B    #$40,D0
  1026.     BLS.S    mt_VolumeOk
  1027.     MOVEQ    #$40,D0
  1028. mt_VolumeOk
  1029.     MOVE.B    D0,n_volume(A6)
  1030.     MOVE.W    D0,8(A5)
  1031.     RTS
  1032.  
  1033. mt_PatternBreak
  1034.     MOVEQ    #0,D0
  1035.     MOVE.B    n_cmdlo(A6),D0
  1036.     MOVE.L    D0,D2
  1037.     LSR.B    #4,D0
  1038.     MULU    #10,D0
  1039.     AND.B    #$0F,D2
  1040.     ADD.B    D2,D0
  1041.     CMP.B    #63,D0
  1042.     BHI.S    mt_pj2
  1043.     MOVE.B    D0,mt_PBreakPos
  1044.     ST    mt_PosJumpFlag
  1045.     RTS
  1046.  
  1047. mt_SetSpeed
  1048.     MOVEQ    #0,D0
  1049.     MOVE.B    3(A6),D0
  1050.     BEQ    mt_end
  1051.     CMP.B    #32,D0
  1052.     BHS    SetTempo
  1053.     CLR.B    mt_counter
  1054.     MOVE.B    D0,mt_speed
  1055.     RTS
  1056.  
  1057. mt_CheckMoreEfx
  1058.     BSR    mt_UpdateFunk
  1059.     MOVE.B    2(A6),D0
  1060.     AND.B    #$0F,D0
  1061.     CMP.B    #$9,D0
  1062.     BEQ    mt_SampleOffset
  1063.     CMP.B    #$B,D0
  1064.     BEQ    mt_PositionJump
  1065.     CMP.B    #$D,D0
  1066.     BEQ.S    mt_PatternBreak
  1067.     CMP.B    #$E,D0
  1068.     BEQ.S    mt_E_Commands
  1069.     CMP.B    #$F,D0
  1070.     BEQ.S    mt_SetSpeed
  1071.     CMP.B    #$C,D0
  1072.     BEQ    mt_VolumeChange
  1073.     BRA    mt_PerNop
  1074.  
  1075. mt_E_Commands
  1076.     MOVE.B    n_cmdlo(A6),D0
  1077.     AND.B    #$F0,D0
  1078.     LSR.B    #4,D0
  1079.     BEQ.S    mt_FilterOnOff
  1080.     CMP.B    #1,D0
  1081.     BEQ    mt_FinePortaUp
  1082.     CMP.B    #2,D0
  1083.     BEQ    mt_FinePortaDown
  1084.     CMP.B    #3,D0
  1085.     BEQ.S    mt_SetGlissControl
  1086.     CMP.B    #4,D0
  1087.     BEQ    mt_SetVibratoControl
  1088.     CMP.B    #5,D0
  1089.     BEQ    mt_SetFineTune
  1090.     CMP.B    #6,D0
  1091.     BEQ    mt_JumpLoop
  1092.     CMP.B    #7,D0
  1093.     BEQ    mt_SetTremoloControl
  1094.     CMP.B    #9,D0
  1095.     BEQ    mt_RetrigNote
  1096.     CMP.B    #$A,D0
  1097.     BEQ    mt_VolumeFineUp
  1098.     CMP.B    #$B,D0
  1099.     BEQ    mt_VolumeFineDown
  1100.     CMP.B    #$C,D0
  1101.     BEQ    mt_NoteCut
  1102.     CMP.B    #$D,D0
  1103.     BEQ    mt_NoteDelay
  1104.     CMP.B    #$E,D0
  1105.     BEQ    mt_PatternDelay
  1106.     CMP.B    #$F,D0
  1107.     BEQ    mt_FunkIt
  1108.     RTS
  1109.  
  1110. mt_FilterOnOff
  1111.     MOVE.B    n_cmdlo(A6),D0
  1112.     AND.B    #1,D0
  1113.     ASL.B    #1,D0
  1114.     AND.B    #$FD,$BFE001
  1115.     OR.B    D0,$BFE001
  1116.     RTS    
  1117.  
  1118. mt_SetGlissControl
  1119.     MOVE.B    n_cmdlo(A6),D0
  1120.     AND.B    #$0F,D0
  1121.     AND.B    #$F0,n_glissfunk(A6)
  1122.     OR.B    D0,n_glissfunk(A6)
  1123.     RTS
  1124.  
  1125. mt_SetVibratoControl
  1126.     MOVE.B    n_cmdlo(A6),D0
  1127.     AND.B    #$0F,D0
  1128.     AND.B    #$F0,n_wavecontrol(A6)
  1129.     OR.B    D0,n_wavecontrol(A6)
  1130.     RTS
  1131.  
  1132. mt_SetFineTune
  1133.     MOVE.B    n_cmdlo(A6),D0
  1134.     AND.B    #$0F,D0
  1135.     MOVE.B    D0,n_finetune(A6)
  1136.     RTS
  1137.  
  1138. mt_JumpLoop
  1139.     TST.B    mt_counter
  1140.     BNE    mt_Return
  1141.     MOVE.B    n_cmdlo(A6),D0
  1142.     AND.B    #$0F,D0
  1143.     BEQ.S    mt_SetLoop
  1144.     TST.B    n_loopcount(A6)
  1145.     BEQ.S    mt_jumpcnt
  1146.     SUBQ.B    #1,n_loopcount(A6)
  1147.     BEQ    mt_Return
  1148. mt_jmploop    MOVE.B    n_pattpos(A6),mt_PBreakPos
  1149.     ST    mt_PBreakFlag
  1150.     RTS
  1151.  
  1152. mt_jumpcnt
  1153.     MOVE.B    D0,n_loopcount(A6)
  1154.     BRA.S    mt_jmploop
  1155.  
  1156. mt_SetLoop
  1157.     MOVE.W    mt_PatternPos(PC),D0
  1158.     LSR.W    #4,D0
  1159.     MOVE.B    D0,n_pattpos(A6)
  1160.     RTS
  1161.  
  1162. mt_SetTremoloControl
  1163.     MOVE.B    n_cmdlo(A6),D0
  1164.     AND.B    #$0F,D0
  1165.     LSL.B    #4,D0
  1166.     AND.B    #$0F,n_wavecontrol(A6)
  1167.     OR.B    D0,n_wavecontrol(A6)
  1168.     RTS
  1169.  
  1170. mt_RetrigNote
  1171.     MOVE.L    D1,-(SP)
  1172.     MOVEQ    #0,D0
  1173.     MOVE.B    n_cmdlo(A6),D0
  1174.     AND.B    #$0F,D0
  1175.     BEQ.S    mt_rtnend
  1176.     MOVEQ    #0,D1
  1177.     MOVE.B    mt_counter(PC),D1
  1178.     BNE.S    mt_rtnskp
  1179.     MOVE.W    (A6),D1
  1180.     AND.W    #$0FFF,D1
  1181.     BNE.S    mt_rtnend
  1182.     MOVEQ    #0,D1
  1183.     MOVE.B    mt_counter(PC),D1
  1184. mt_rtnskp
  1185.     DIVU    D0,D1
  1186.     SWAP    D1
  1187.     TST.W    D1
  1188.     BNE.S    mt_rtnend
  1189. mt_DoRetrig
  1190. ;    MOVE.W    n_dmabit(A6),$DFF096    ; Channel DMA off
  1191.     MOVE.L    n_start(A6),(A5)    ; Set sampledata pointer
  1192.     MOVE.W    n_length(A6),4(A5)    ; Set length
  1193.     MOVE.W    n_dmabit(A6),D0
  1194.     BSR    mt_PlaySamples        ; this does the magic
  1195.     MOVE.L    n_loopstart(A6),(A5)
  1196.     MOVE.L    n_replen(A6),4(A5)
  1197. mt_rtnend
  1198.     MOVE.L    (SP)+,D1
  1199.     RTS
  1200.  
  1201. mt_VolumeFineUp
  1202.     TST.B    mt_counter
  1203.     BNE    mt_Return
  1204.     MOVEQ    #0,D0
  1205.     MOVE.B    n_cmdlo(A6),D0
  1206.     AND.B    #$F,D0
  1207.     BRA    mt_VolSlideUp
  1208.  
  1209. mt_VolumeFineDown
  1210.     TST.B    mt_counter
  1211.     BNE    mt_Return
  1212.     MOVEQ    #0,D0
  1213.     MOVE.B    n_cmdlo(A6),D0
  1214.     AND.B    #$0F,D0
  1215.     BRA    mt_VolSlideDown2
  1216.  
  1217. mt_NoteCut
  1218.     MOVEQ    #0,D0
  1219.     MOVE.B    n_cmdlo(A6),D0
  1220.     AND.B    #$0F,D0
  1221.     CMP.B    mt_counter(PC),D0
  1222.     BNE    mt_Return
  1223.     CLR.B    n_volume(A6)
  1224.     MOVE.W    #0,8(A5)
  1225.     RTS
  1226.  
  1227. mt_NoteDelay
  1228.     MOVEQ    #0,D0
  1229.     MOVE.B    n_cmdlo(A6),D0
  1230.     AND.B    #$0F,D0
  1231.     CMP.B    mt_Counter,D0
  1232.     BNE    mt_Return
  1233.     MOVE.W    (A6),D0
  1234.     BEQ    mt_Return
  1235.     MOVE.L    D1,-(SP)
  1236.     BRA    mt_DoRetrig
  1237.  
  1238. mt_PatternDelay
  1239.     TST.B    mt_counter
  1240.     BNE    mt_Return
  1241.     MOVEQ    #0,D0
  1242.     MOVE.B    n_cmdlo(A6),D0
  1243.     AND.B    #$0F,D0
  1244.     TST.B    mt_PattDelTime2
  1245.     BNE    mt_Return
  1246.     ADDQ.B    #1,D0
  1247.     MOVE.B    D0,mt_PattDelTime
  1248.     RTS
  1249.  
  1250. mt_FunkIt
  1251.     TST.B    mt_counter
  1252.     BNE    mt_Return
  1253.     MOVE.B    n_cmdlo(A6),D0
  1254.     AND.B    #$0F,D0
  1255.     LSL.B    #4,D0
  1256.     AND.B    #$0F,n_glissfunk(A6)
  1257.     OR.B    D0,n_glissfunk(A6)
  1258.     TST.B    D0
  1259.     BEQ    mt_Return
  1260. mt_UpdateFunk
  1261.     MOVEM.L    A0/D1,-(SP)
  1262.     MOVEQ    #0,D0
  1263.     MOVE.B    n_glissfunk(A6),D0
  1264.     LSR.B    #4,D0
  1265.     BEQ.S    mt_funkend
  1266.     LEA    mt_FunkTable(PC),A0
  1267.     MOVE.B    (A0,D0.W),D0
  1268.     ADD.B    D0,n_funkoffset(A6)
  1269.     BTST    #7,n_funkoffset(A6)
  1270.     BEQ.S    mt_funkend
  1271.     CLR.B    n_funkoffset(A6)
  1272.  
  1273.     MOVE.L    n_loopstart(A6),D0
  1274.     MOVEQ    #0,D1
  1275.     MOVE.W    n_replen(A6),D1
  1276.     ADD.L    D1,D0
  1277.     ADD.L    D1,D0
  1278.     MOVE.L    n_wavestart(A6),A0
  1279.     ADDQ.L    #1,A0
  1280.     CMP.L    D0,A0
  1281.     BLO.S    mt_funkok
  1282.     MOVE.L    n_loopstart(A6),A0
  1283. mt_funkok
  1284.     MOVE.L    A0,n_wavestart(A6)
  1285.     MOVEQ    #-1,D0
  1286.     SUB.B    (A0),D0
  1287.     MOVE.B    D0,(A0)
  1288. mt_funkend
  1289.     MOVEM.L    (SP)+,A0/D1
  1290.     RTS
  1291.  
  1292.  
  1293. mt_FunkTable dc.b 0,5,6,7,8,10,11,13,16,19,22,26,32,43,64,128
  1294.  
  1295. mt_VibratoTable    
  1296.     dc.b   0, 24, 49, 74, 97,120,141,161
  1297.     dc.b 180,197,212,224,235,244,250,253
  1298.     dc.b 255,253,250,244,235,224,212,197
  1299.     dc.b 180,161,141,120, 97, 74, 49, 24
  1300.  
  1301. mt_PeriodTable
  1302. ; Tuning 0, Normal
  1303.     dc.w    856,808,762,720,678,640,604,570,538,508,480,453
  1304.     dc.w    428,404,381,360,339,320,302,285,269,254,240,226
  1305.     dc.w    214,202,190,180,170,160,151,143,135,127,120,113
  1306. ; Tuning 1
  1307.     dc.w    850,802,757,715,674,637,601,567,535,505,477,450
  1308.     dc.w    425,401,379,357,337,318,300,284,268,253,239,225
  1309.     dc.w    213,201,189,179,169,159,150,142,134,126,119,113
  1310. ; Tuning 2
  1311.     dc.w    844,796,752,709,670,632,597,563,532,502,474,447
  1312.     dc.w    422,398,376,355,335,316,298,282,266,251,237,224
  1313.     dc.w    211,199,188,177,167,158,149,141,133,125,118,112
  1314. ; Tuning 3
  1315.     dc.w    838,791,746,704,665,628,592,559,528,498,470,444
  1316.     dc.w    419,395,373,352,332,314,296,280,264,249,235,222
  1317.     dc.w    209,198,187,176,166,157,148,140,132,125,118,111
  1318. ; Tuning 4
  1319.     dc.w    832,785,741,699,660,623,588,555,524,495,467,441
  1320.     dc.w    416,392,370,350,330,312,294,278,262,247,233,220
  1321.     dc.w    208,196,185,175,165,156,147,139,131,124,117,110
  1322. ; Tuning 5
  1323.     dc.w    826,779,736,694,655,619,584,551,520,491,463,437
  1324.     dc.w    413,390,368,347,328,309,292,276,260,245,232,219
  1325.     dc.w    206,195,184,174,164,155,146,138,130,123,116,109
  1326. ; Tuning 6
  1327.     dc.w    820,774,730,689,651,614,580,547,516,487,460,434
  1328.     dc.w    410,387,365,345,325,307,290,274,258,244,230,217
  1329.     dc.w    205,193,183,172,163,154,145,137,129,122,115,109
  1330. ; Tuning 7
  1331.     dc.w    814,768,725,684,646,610,575,543,513,484,457,431
  1332.     dc.w    407,384,363,342,323,305,288,272,256,242,228,216
  1333.     dc.w    204,192,181,171,161,152,144,136,128,121,114,108
  1334. ; Tuning -8
  1335.     dc.w    907,856,808,762,720,678,640,604,570,538,508,480
  1336.     dc.w    453,428,404,381,360,339,320,302,285,269,254,240
  1337.     dc.w    226,214,202,190,180,170,160,151,143,135,127,120
  1338. ; Tuning -7
  1339.     dc.w    900,850,802,757,715,675,636,601,567,535,505,477
  1340.     dc.w    450,425,401,379,357,337,318,300,284,268,253,238
  1341.     dc.w    225,212,200,189,179,169,159,150,142,134,126,119
  1342. ; Tuning -6
  1343.     dc.w    894,844,796,752,709,670,632,597,563,532,502,474
  1344.     dc.w    447,422,398,376,355,335,316,298,282,266,251,237
  1345.     dc.w    223,211,199,188,177,167,158,149,141,133,125,118
  1346. ; Tuning -5
  1347.     dc.w    887,838,791,746,704,665,628,592,559,528,498,470
  1348.     dc.w    444,419,395,373,352,332,314,296,280,264,249,235
  1349.     dc.w    222,209,198,187,176,166,157,148,140,132,125,118
  1350. ; Tuning -4
  1351.     dc.w    881,832,785,741,699,660,623,588,555,524,494,467
  1352.     dc.w    441,416,392,370,350,330,312,294,278,262,247,233
  1353.     dc.w    220,208,196,185,175,165,156,147,139,131,123,117
  1354. ; Tuning -3
  1355.     dc.w    875,826,779,736,694,655,619,584,551,520,491,463
  1356.     dc.w    437,413,390,368,347,328,309,292,276,260,245,232
  1357.     dc.w    219,206,195,184,174,164,155,146,138,130,123,116
  1358. ; Tuning -2
  1359.     dc.w    868,820,774,730,689,651,614,580,547,516,487,460
  1360.     dc.w    434,410,387,365,345,325,307,290,274,258,244,230
  1361.     dc.w    217,205,193,183,172,163,154,145,137,129,122,115
  1362. ; Tuning -1
  1363.     dc.w    862,814,768,725,684,646,610,575,543,513,484,457
  1364.     dc.w    431,407,384,363,342,323,305,288,272,256,242,228
  1365.     dc.w    216,203,192,181,171,161,152,144,136,128,121,114
  1366.  
  1367. mt_chan1temp    dc.l    0,0,0,0,0,$00010000,0,  0,0,0,0
  1368. mt_chan2temp    dc.l    0,0,0,0,0,$00020000,0,  0,0,0,0
  1369. mt_chan3temp    dc.l    0,0,0,0,0,$00040000,0,  0,0,0,0
  1370. mt_chan4temp    dc.l    0,0,0,0,0,$00080000,0,  0,0,0,0
  1371.  
  1372. mt_SampleStarts    dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1373.         dc.l    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1374.  
  1375. mt_SongDataPtr    dc.l 0
  1376. mt_speed    dc.b 6
  1377. mt_counter    dc.b 0
  1378. mt_SongPos    dc.b 0
  1379. mt_PBreakPos    dc.b 0
  1380. mt_PosJumpFlag    dc.b 0
  1381. mt_PBreakFlag    dc.b 0
  1382. mt_LowMask    dc.b 0
  1383. mt_PattDelTime    dc.b 0
  1384. mt_PattDelTime2    dc.b 0
  1385. mt_Enable    dc.b 0
  1386. mt_PatternPos    dc.w 0
  1387. mt_DMACONtemp    dc.w 0
  1388.  
  1389. ;/* End of File */
  1390.